﻿Imports WiremetModel.Entities.Tracking
Imports WiremetModel.Entities

Public Class ZleceniaTrackingSzukajForm

    Private _zleceniaTrackingDictionary As Dictionary(Of Integer, Zlecenie)
    Private _unitOfWork As UnitOfWork

    Private _filterNumerZlecenia As String
    Private _filterKlientId As Integer
    Private _isDateFilterEnabled As Boolean
    Private _filterDateStart As Date
    Private _filterDateEnd As Date
    Private _filterStatusZleceniaId As Integer
    Private _filterGatunekId As Integer
    Private _filterWymiar As String


    Public Sub New()

        InitializeComponent()
        _unitOfWork = New UnitOfWork()
        RefreshViewData()
        SetInitialFilter()
        RunFilter()

    End Sub

    Private Sub ZleceniaTrackingSzukajForm_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        _unitOfWork.Dispose()
    End Sub


    Private Sub RefreshViewData()

        Dim zleceniaTrackingRepository As New Repository(Of Zlecenie)(_unitOfWork)
        Dim statusRepository As New Repository(Of OEM.Status)(_unitOfWork)
        Dim klientRepository As New Repository(Of OEM.Klient)(_unitOfWork)
        Dim gatunekRepository As New Repository(Of OEM.Gatunek)(_unitOfWork)

        _zleceniaTrackingDictionary = zleceniaTrackingRepository.GetAll().ToDictionary(Function(x) x.Id, Function(x) x)
        Dim klientList As IEnumerable(Of OEM.Klient) = klientRepository.GetAll().OrderBy(Function(x) x.NazwaSkrocona)
        Dim statusZleceniaList As IEnumerable(Of OEM.Status) = statusRepository.GetAll().OrderBy(Function(x) x.Nazwa)
        Dim gatunekList As IEnumerable(Of OEM.Gatunek) = gatunekRepository.GetAll().OrderBy(Function(x) x.NazwaAng)

        InitializeFilterComboBox(cmb_NazwaFirmy, klientList.ToDictionary(Function(x) x.Id, Function(x) x.NazwaSkrocona))
        InitializeFilterComboBox(cmb_StatusZlecenia, statusZleceniaList.ToDictionary(Function(x) x.Id, Function(x) x.Nazwa))
        InitializeFilterComboBox(cmb_FiltrGatunek, gatunekList.ToDictionary(Function(x) x.Id, Function(x) x.NazwaAng))

    End Sub


    Private Sub InitializeFilterComboBox(ByRef cmbFilter As ComboBox, ByVal data As Dictionary(Of Integer, String))

        cmbFilter.DataSource = New BindingSource(data, Nothing)
        cmbFilter.DisplayMember = "Value"
        cmbFilter.ValueMember = "Key"
        cmbFilter.AutoCompleteCustomSource.Clear()
        cmbFilter.AutoCompleteCustomSource.AddRange(data.Values.OrderBy(Function(x) x).ToArray())
        cmbFilter.SelectedIndex = -1

    End Sub


    Private Sub SetInitialFilter()

        cmb_StatusZlecenia.SelectedValue = 4

    End Sub


    Private Sub RefreshZleceniaTable(ByVal zleceniaList As IEnumerable(Of Zlecenie))
        dgv_Zlecenia.Rows.Clear()
        For Each zlecenie As Zlecenie In zleceniaList

            Dim index As Integer = dgv_Zlecenia.Rows.Add(zlecenie.Id, zlecenie.Numer, zlecenie.Klient.NazwaSkrocona,
                                        zlecenie.DataZamowienia.ToShortDateString(), zlecenie.Termin.ToShortDateString(),
                                        zlecenie.Status.Nazwa)

            Select Case CType(zlecenie.Termin, Date).ToShortDateString
                Case Date.Today.ToShortDateString()
                    dgv_Zlecenia.Rows(index).DefaultCellStyle.BackColor = My.Settings.Yellow500
                Case DateSerial(Today.Year, Today.Month, Today.Day + 1).ToShortDateString()
                    dgv_Zlecenia.Rows(index).DefaultCellStyle.BackColor = My.Settings.Yellow500
                Case Is < DateSerial(Today.Year, Today.Month, Today.Day).ToShortDateString()
                    dgv_Zlecenia.Rows(index).DefaultCellStyle.BackColor = My.Settings.Red350
            End Select
        Next
    End Sub


    Private Sub UpdateFilter()

        _filterNumerZlecenia = tb_NumerZlecenia.Text.Trim()
        _filterKlientId = CInt(cmb_NazwaFirmy.SelectedValue)
        _isDateFilterEnabled = cb_DataRealizacji.Checked
        _filterDateStart = dtp_DataRealizacjiPoczatkowa.Value.Date
        _filterDateEnd = dtp_DataRealizacjiKoncowa.Value.Date
        _filterStatusZleceniaId = CInt(cmb_StatusZlecenia.SelectedValue)
        _filterGatunekId = CInt(cmb_FiltrGatunek.SelectedValue)
        _filterWymiar = tb_FiltrWymiar.Text.Trim()

    End Sub

    Private Function IsZlecenieSatisfiedByFilter(ByVal zlecenie As Zlecenie) As Boolean

        Return zlecenie.Numer.StartsWith(_filterNumerZlecenia, StringComparison.CurrentCultureIgnoreCase) AndAlso
                               (_filterKlientId = 0 OrElse zlecenie.Klient.Id = _filterKlientId) AndAlso
                               (Not _isDateFilterEnabled OrElse (zlecenie.Termin >= _filterDateStart AndAlso zlecenie.Termin <= _filterDateEnd)) AndAlso
                               (_filterStatusZleceniaId = 0 OrElse zlecenie.Status.Id = _filterStatusZleceniaId) AndAlso
                               (_filterGatunekId = 0 OrElse (zlecenie.PozycjeZlecenia.Values.Any(Function(x) x.Gatunek.Id = _filterGatunekId))) AndAlso
                               (String.IsNullOrEmpty(_filterWymiar) OrElse (zlecenie.PozycjeZlecenia.Values.Where(Function(x) x.Wymiar.StartsWith(_filterWymiar, StringComparison.CurrentCultureIgnoreCase)).Count > 0))

    End Function


    Private Sub RunFilter()

        UpdateFilter()
        Dim filteredZlecenia As New List(Of Zlecenie)

        For Each zlecenie As Zlecenie In _zleceniaTrackingDictionary.Values
            If IsZlecenieSatisfiedByFilter(zlecenie) Then
                filteredZlecenia.Add(zlecenie)
            End If
        Next

        dgv_Zlecenia.Rows.Clear()
        RefreshZleceniaTable(filteredZlecenia.OrderByDescending(Function(x) x.Termin))

        ComboBoxCleanupWhenNoValueSelected(cmb_FiltrGatunek)
        ComboBoxCleanupWhenNoValueSelected(cmb_NazwaFirmy)
        ComboBoxCleanupWhenNoValueSelected(cmb_StatusZlecenia)

    End Sub

    Private Sub ComboBoxCleanupWhenNoValueSelected(ByRef comboBox As ComboBox)
        If comboBox.SelectedValue Is Nothing Then
            comboBox.ResetText()
        End If
    End Sub


    Private Sub ClearFilter()

        tb_NumerZlecenia.Text = String.Empty
        cmb_NazwaFirmy.ResetText()
        cmb_NazwaFirmy.SelectedIndex = -1
        dtp_DataRealizacjiPoczatkowa.Value = Now.Date
        dtp_DataRealizacjiKoncowa.Value = Now.Date
        cb_DataRealizacji.Checked = False
        cmb_StatusZlecenia.ResetText()
        cmb_StatusZlecenia.SelectedIndex = -1
        cmb_FiltrGatunek.ResetText()
        cmb_FiltrGatunek.SelectedIndex = -1
        tb_FiltrWymiar.Text = String.Empty

    End Sub

    Private Sub btn_Szukaj_Click(sender As System.Object, e As System.EventArgs) Handles btn_Szukaj.Click
        RunFilter()
    End Sub

    Private Sub btn_WyczyscSzczegoly_Click(sender As System.Object, e As System.EventArgs) Handles btn_WyczyscSzczegoly.Click
        ClearFilter()
        RunFilter()
    End Sub


    Private Sub btn_Refresh_Click(sender As System.Object, e As System.EventArgs) Handles btn_Refresh.Click
        _unitOfWork.Dispose()
        _unitOfWork = New UnitOfWork()
        RefreshViewData()
        ClearFilter()
        SetInitialFilter()
        RunFilter()
    End Sub

    Private Sub filterInput_KeyDown(sender As Object, e As KeyEventArgs) Handles tb_NumerZlecenia.KeyDown, cmb_NazwaFirmy.KeyDown, cmb_StatusZlecenia.KeyDown, cmb_FiltrGatunek.KeyDown, tb_FiltrWymiar.KeyDown
        If e.KeyCode = Keys.Enter Then
            RunFilter()
        End If
    End Sub


    Private Sub dtpDataRealizacjiOd_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dtp_DataRealizacjiPoczatkowa.ValueChanged
        cb_DataRealizacji.Checked = True
    End Sub



    Private Sub dgv_Zlecenia_CellMouseDoubleClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv_Zlecenia.CellMouseDoubleClick

        Try
            If dgv_Zlecenia.SelectedRows.Count = 0 Then
                Throw New Exception("Proszę, wybierz zlecenie, aby kontynuować")
            End If

            Dim biuroCredentials As OEM.Uprawienie = User.Role.GetValueOrDefault("biuro")

            If biuroCredentials.WyznOdczytu Then
                Dim zlecenie As Zlecenie = _zleceniaTrackingDictionary(CInt(dgv_Zlecenia.SelectedRows(0).Cells("ZlecenieId").Value))

                Me.Cursor = Cursors.WaitCursor
                Dim zlecenieGosia As New clsInhTrZlecenie(zlecenie.Id, New clsDataBase(VAR_CONNECTION_PARAMETERS, VAR_ERROR_HANDLER), True)
                Me.Cursor = Cursors.Default

                Dim zlecenieForm As New frmTrZlecenie(zlecenieGosia)
                zlecenieForm.MdiParent = MdiParent
                zlecenieForm.Show()

            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try


    End Sub


    Private Sub RefreshDetailsPozycjeZleceniaTable(ByVal pozycjaZleceniaList As IEnumerable(Of PozycjaZlecenia))
        dgv_PozycjeZlecenia.Rows.Clear()
        For Each pozycjaZlecenia As PozycjaZlecenia In pozycjaZleceniaList
            dgv_PozycjeZlecenia.Rows.Add(
                pozycjaZlecenia.Id,
                pozycjaZlecenia.Wymiar,
                pozycjaZlecenia.Gatunek.NazwaAng,
                pozycjaZlecenia.Ilosc + " " + pozycjaZlecenia.JednostkaMiary.Jednostka,
                pozycjaZlecenia.Pakowanie.Nazwa)
        Next
    End Sub


    Private Sub RefreshDetails(ByVal zlecenie As Zlecenie)

        tb_DataUtworzenia.Text = zlecenie.ZlecenieOEM.DataUtworzenia.ToShortDateString()
        tb_StatusWysylki.Text = zlecenie.ZlecenieOEM.StatusWysylki.Nazwa
        tb_Uwagi.Text = zlecenie.Uwagi
        RefreshDetailsPozycjeZleceniaTable(zlecenie.PozycjeZlecenia.Values.OrderBy(Function(x) x.Wymiar))

    End Sub


    Private Sub RefreshDetails()
        If Not sc_ZlecenieView.Panel2Collapsed AndAlso Not dgv_Zlecenia.SelectedRows.Count = 0 Then
            Dim zlecenieId As Integer = CInt(dgv_Zlecenia.SelectedRows(0).Cells("ZlecenieId").Value)
            RefreshDetails(_zleceniaTrackingDictionary(zlecenieId))
        End If
    End Sub


    Private Sub dgv_Zlecenia_SelectionChanged(ByVal sender As System.Object, ByVal e As EventArgs) Handles dgv_Zlecenia.SelectionChanged
        RefreshDetails()
    End Sub
End Class